《TCP IP高效编程————改造网络程序的44个技巧》学习记录
技巧1:理解面向链接和无连接协议之间的区别
- 对于无连接协议来说,每个分组的处理都独立于所有其他分组,而对于面向连接的协议来说,协议实现维护了与后继分组有关的状态信息。
- 对TCP来说,连接完全是想象的,它是由端点所记忆的状态组成的, 并不存在“物理”连接。
技巧2:理解子网和CIDR的概念
- A、B、C、D、E类网络,网络ID和主机ID
- 子网划分
- CIDR——Classless Inter Domain Routing,无类别域间路由
技巧3:理解私有地址和NAT
- 10.0.0.0-10.255.255.255(前缀10/8)、172.16.0.0-172.31.255.255(前缀172.16/12)、192.168.0.0-192.168.255.255(前缀192.168/16)
- NAT——Network Address Translation,网络地址翻译
- PAT——Port Address Translation,端口地址转换
技巧4:开发并使用应用程序“框架”
- TCP服务端:socket->bind->listen->accept
- TCP客户端:socket->connect
- UDP服务端:socket->bind
- UDP客户端:socket
技巧5:套接字接口比XTI/TLI更好用
技巧6:记住,TCP是一种流协议
- TCP是一种流协议,数据以字节流的形式传递给接收者的,没有固有的“报文”或“报文边界”的概念
技巧7:不要低估TCP的性能
技巧8:避免重新编写TCP
技巧9:要认识到TCP是一个可靠的,但并不绝对可靠的协议
技巧10:记住,TCP/IP不是轮询的
- TCP没有提供将连接丢失即时通知给应用程序的方法
- 保持活跃(keep-alive)
- 心跳信号(epoll, pthread)
技巧11:提防对等尸体的不友好动作
技巧12:成功的LAN策略不一定能推广到WAN中
技巧13:了解协议是怎样工作的
- RFC是TCP/IP的官方规范
技巧14:不要把OSI七层参考模型太当回事
- OSI和TCP/IP
技巧15:理解TCP的写操作
- 从应用程序的角度来看,最好把写操作当作是一项将数据从用户空间拷贝到内核发送缓冲区,然后就返回的操作。
- 如果发送端应用程序崩溃了,TCP会继续尝试着将数据传递给对等实体。
技巧16:理解TCP的有序释放操作
- 有序释放是在确保没有数据丢失的情况下拆除n连接的一个过程。
- shutdown与close的区别
技巧17:考虑用inetd来装载应用程序
技巧18:考虑用tcpmux为服务器“分配”知名端口
技巧19:考虑使用两条TCP连接
技巧20:使应用程序成为事件驱动的(1)
技巧21:使应用程序成为事件驱动的(2)
技巧22:不要用TIME-WAIT暗杀来关闭一条连接
- 通常只有一端——主动关闭的那一端会进入TIME-WAIT状态
- 使用TIME-WAIT状态主要由两个目的:
1) 维护连接状态,以防主动关闭连接的那段发送的最后一条ACK丢失后造成另一端重新发送FIN信号
2) 为耗尽网络中所有此连接的“走失段”提供时间
技巧23:服务器应该设置SO_REUSERADDR选项
技巧24:可能的话,使用一个大规模的写操作,而不是多个小规模的写操作
- 上下文的切换耗时
- Nagle算法影响
技巧25:理解如何使connect调用超时
技巧26:避免数据复制
技巧27:使用前将结构sockaddr_in清零
技巧28:不要忘记字节的“性别”
技巧29:不要将IP地址或端口号硬编入应用程序中
技巧30:理解已连接的UDP套接字
- connect操作
技巧31:记住,并不是所有程序都是用C编写的
技巧32:理解缓冲区长度带来的影响
技巧33:熟悉ping使用工具
- ping没有使用TCP或UDP,因此没有相关的知名端口,使用ICMP
技巧34:学习使用tcpdump或类似的工具
技巧35:学习使用traceroute
- traceroute是诊断网络问题,学习网络路由以及探查网络拓扑的非常游泳的工具。
技巧36:学习使用ttcp
技巧37:学习使用lsof
技巧38:学习使用netstat
技巧39:学习使用系统中的调用追踪工具(strace)
技巧40:构建并使用捕获ICMP报文的工具
技巧41:读Stevens的书
技巧42:阅读代码
技巧43:访问RFC编辑者的页面
技巧44:经常访问新闻组